package com.dys.arithmeticoperator;

/**
 * @className: com.dys.arithmeticoperator.LogicalOperator
 * @description: 逻辑运算符：& | && || ^
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/06/15 下午9:58
 */
public class LogicalOperator {

    public static void main(String[] args) {
        test();
    }

    /**
     * 逻辑与、逻辑或、短路与、短路或、逻辑非、逻辑异或
     * 逻辑运算符，进行逻辑运算的，运算符左右连接的都是布尔类型的操作数，最终表达式结果是布尔值:要么true，要么false
     */
    public static void testLogicalOperator() {
        // 逻辑与: &: 规律：只要有一个操作数是false，结果一定是false
        System.out.println("-------逻辑与----------");
        System.out.println(true & true);
        System.out.println((5 < 8) & (9 == 9));
        System.out.println(true & false);
        System.out.println(false & false);
        System.out.println(false & true);

        // 短路与: && 规律：效率高一些，只要第一个表达式是false,那么第二个表达式就不用计算了，结果一定是false,如果第一个表达式是true,最终还是得靠第二个表达式计算
        // 效率高只针对第一个表达式的结果为false的情况
        System.out.println("-------短路与----------");
        System.out.println(true && true);
        System.out.println(true && false);
        System.out.println(false && false);
        System.out.println(false && true);

        // 逻辑或：| 规律：只要有一个操作数是true,那么结果一定是true
        System.out.println("-------逻辑或----------");
        System.out.println(true | true);
        System.out.println(true | false);
        System.out.println(false | false);
        System.out.println(false | true);

        // 短路或：|| 规律：高效一些，只要第一个表达式是true,那么第二个表达式就不用计算了，结果一定是true
        System.out.println("-------短路或----------");
        System.out.println(true || true);
        System.out.println(true || false);
        System.out.println(false || false);
        System.out.println(false || true);

        // 逻辑非：! 规律：相反结果
        System.out.println("-------逻辑非----------");
        System.out.println(!true);
        System.out.println(!false);

        // 逻辑异或：^ 规律：两个操作数相同，结果为false，不相同，结果为true。左右两边是一个表达式
        System.out.println("-------逻辑异或----------");
        System.out.println(true ^ true);
        System.out.println(true ^ false);
        System.out.println(false ^ false);
        System.out.println(false ^ true);
    }

    public static void test() {
        int i = 8;
        System.out.println((5 < 7) && (i++ == 2)); // false
        System.out.println(i);

        int a = 8;
        System.out.println((5 > 7) & (a++ == 2)); // false
        System.out.println(a);

        int m = 8;
        System.out.println((5 > 7) && (m++ == 2)); // false
        System.out.println(m);

        int b = 2;
        System.out.println((5 < 7) & (b++ == 2)); // true
        System.out.println(b);

        int c = 2;
        System.out.println((5 < 7) & (++c == 2)); // false
        System.out.println(c);
    }
}
